/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxline.service;

import br.com.foxline.atlasmobile.enums.TipoDocumento;
import br.com.foxline.model.Proprietario;
import br.com.foxline.util.Caracter;
import br.com.foxline.util.Msg;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;

/**
 *
 * @author laverson
 */
@Stateless
public class ProprietarioService extends GenericService<Proprietario> {

    public ProprietarioService() {
        super(Proprietario.class);
    }

    /**
     *
     * @param existProprietario retorna uma pessoa física ou jurídica
     */
    public Proprietario existProprietario(TipoDocumento td, String doc) {
        Proprietario proprietario;
        String sql = "Select p from Proprietario p where ";
        if (td == TipoDocumento.CPF) {
            sql += " lower(p.cpf) ";
        } else {
            sql += " lower(p.cnpj) ";
        }
        sql += " like lower(:doc)";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("doc", doc);
        try {
            proprietario = (Proprietario) query.getResultList().get(0);

        } catch (NoResultException nr) {
            return null;
        } catch (NonUniqueResultException nre) {
            return null;
        } catch (Exception e) {
            return null;
        }

        return proprietario;
    }

    /**
     *
     * @param existDocuments verifica se existe do documento e retorna um
     * Proprietario
     */
    public Proprietario existDocuments(Proprietario p) {
        removeCaracterDocument(p);
        Proprietario pe = existProprietario(p.getTipoDocumento(), typeDocument(p));
        if (pe != null) {
            p = pe;
            if (p.getCnpj() != null) {
                p.setTipoDocumento(TipoDocumento.CNPJ);
            } else if (p.getCpf() != null) {
                p.setTipoDocumento(TipoDocumento.CPF);
            }
        } else {

            if (p.getCnpj() != null) {
                String cnpj;
                cnpj = p.getCnpj();
                p = new Proprietario();
                p.setTipoDocumento(TipoDocumento.CNPJ);
                p.setCnpj(cnpj);

            } else if (p.getCpf() != null) {
                String cpf;
                cpf = p.getCpf();
                p = new Proprietario();
                p.setTipoDocumento(TipoDocumento.CPF);
                p.setCpf(cpf);

            }
        }
        return p;
    }

    /**
     *
     * @param typeDocument retorna o tipo de documento
     */
    public String typeDocument(Proprietario p) {
        String document = "";
        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            document = p.getCnpj();
        } else if (p.getTipoDocumento() == TipoDocumento.CPF) {
            document = p.getCpf();
        }
        return document;
    }

    /**
     *
     * @param findProprietario pesquisa
     */
    public List<Proprietario> findProprietario(Proprietario p) {
        String sql = "select p from Proprietario p WHERE ";

        if (p.getTipoDocumento() == TipoDocumento.CPF) {
            if ((!p.getNome().equals("")) && (p.getNome() != null)) {
                sql += " lower(p.nome) like lower(:name) and ";
            }
            if ((!p.getCpf().equals("")) && (p.getCpf() != null)) {
                sql += " lower(p.cpf) like lower(:cpf) and  ";
            }
        }
        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            if ((!p.getNomeFantasia().equals("")) && (p.getNomeFantasia() != null)) {
                sql += " lower(p.nomeFantasia) like lower(:name_s) and ";
            }
            if ((!p.getCnpj().equals("")) && (p.getCnpj() != null)) {
                sql += " lower(p.cnpj) like lower(:cnpj) and  ";
            }
        }
        sql += " 1=1 ";
        Query query = getEntityManager().createQuery(sql);

        if (p.getTipoDocumento() == TipoDocumento.CPF) {
            if ((!p.getNome().equals("")) && (p.getNome() != null)) {
                query.setParameter("name", "%" + p.getNome() + "%");
            }
            if ((!p.getCpf().equals("")) && (p.getCpf() != null)) {
                query.setParameter("cpf", "%" + p.getCpf() + "%");
            }
        }
        if (p.getTipoDocumento() == TipoDocumento.CNPJ) {
            if ((!p.getNomeFantasia().equals("")) && (p.getNomeFantasia() != null)) {
                query.setParameter("name_s", "%" + p.getNomeFantasia() + "%");
            }
            if ((!p.getCnpj().equals("")) && (p.getCnpj() != null)) {
                query.setParameter("cnpj", "%" + p.getCnpj() + "%");
            }
        }
        return query.getResultList();
    }

    /**
     *
     * @param removeCaracterDocument remove os caracteres que são utilizados
     * como máscara
     */
    public void removeCaracterDocument(Proprietario p) {
        p.setCpf(Caracter.removecaracter(p.getCpf()));
        p.setCnpj(Caracter.removecaracter(p.getCnpj()));

    }

    /**
     * <pre>Busca por todas as "Pessoas" pelo nome</pre>
     *
     * @param <b>name</b> string contendo todo/parte do nome da pessoa
     * @return Uma lista contendo todos as pessoas que possuem "name" em seu
     * nome, <b>null</b> caso não encontre nenhum resultado
     */
    public List<Proprietario> autocompletePhysical(String name) {
        List<Proprietario> results;
        String sql = "Select p from Proprietario p where "
                + "lower(p.tipoDocumento) like lower(:cpf) and "
                + "lower(p.nome) like lower(:name)"
                + "and 1=1";
        Query query = getEntityManager().createQuery(sql).setMaxResults(50);
        query.setParameter("cpf", "%" + TipoDocumento.CPF.getTipo() + "%");
        if (name != null) {
            query.setParameter("name", "%" + name + "%");
        }
        results = query.getResultList();
        return results;
    }

    /**
     * <pre>Busca por todas as "Pessoas" pelo nome</pre>
     *
     * @param <b>name</b> string contendo todo/parte do nome da pessoa
     * @return Uma lista contendo todos as pessoas que possuem "name" em seu
     * nome, <b>null</b> caso não encontre nenhum resultado
     */
    public List<Proprietario> autocompleteCompany(String name) {
        List<Proprietario> results;
        String sql = "Select p from Proprietario p where "
                + "lower(p.tipoDocumento) like lower(:cnpj) and "
                + "lower(p.nomeFantasia) like lower(:name)"
                + "and 1=1";
        Query query = getEntityManager().createQuery(sql).setMaxResults(50);
        query.setParameter("cnpj", "%" + TipoDocumento.CNPJ.getTipo() + "%");
        if (name != null) {
            query.setParameter("name", "%" + name + "%");
        }
        results = query.getResultList();
        return results;
    }

    @Override
    public void save(Proprietario entity) {
        if (entity.getTipoDocumento().equals(TipoDocumento.CPF)) {
            if (entity.getCpf() != null && !entity.getCpf().equals("")) {
                entity.setCpf(Caracter.removecaracter(entity.getCpf()));
            }
            if (entity.getRg() != null && !entity.getRg().equals("")) {
                entity.setRg(Caracter.removecaracter(entity.getRg()));
            }
        } else {
            if (entity.getCnpj() != null && !entity.getCnpj().equals("")) {
                entity.setCnpj(Caracter.removecaracter(entity.getCnpj()));
            }
        }
        try {
            super.save(entity);
//            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
//            Msg.messagemError(Msg.Failure);
        }
    }

    /**
     * Atualiza um Proprietario
     *
     * @param entity proprietario a ser atualizado
     */
    @Override
    public void update(Proprietario entity) {
        if (entity.getTipoDocumento() == null || entity.getTipoDocumento().equals(TipoDocumento.CPF)) {
            if (entity.getCpf() != null && !entity.getCpf().equals("")) {
                entity.setCpf(Caracter.removecaracter(entity.getCpf()));
            }
            if (entity.getRg() != null && !entity.getRg().equals("")) {
                entity.setRg(Caracter.removecaracter(entity.getRg()));
            }
        } else {
            if (entity.getCnpj() != null && !entity.getCnpj().equals("")) {
                entity.setCnpj(Caracter.removecaracter(entity.getCnpj()));
            }
        }

        entity = verificarProprietario(entity);

        try {
            removeCaracter(entity);
            super.update(entity);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * Remove os caracteres que são utilizados como máscara incluindo o objeto
     * Endereço
     *
     * @param p entidade a ser removido os caracteres
     */
    public void removeCaracter(Proprietario p) {
        if (p.getCpf() != null) {
            p.setCpf(Caracter.removecaracter(p.getCpf()));
        }
        if (p.getCnpj() != null) {
            p.setCnpj(Caracter.removecaracter(p.getCnpj()));
        }
    }

    @Override
    public void delete(Proprietario entity) {
        try {
            super.delete(entity);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public List<Proprietario> getProprietarioImovel(Long i) {
        String sql = "SELECT p FROM Imovel i JOIN i.proprietarios p where i.id = :id";
        Query query = getEntityManager().createQuery(sql);
        query.setParameter("id", i);
        return (List<Proprietario>) query.getResultList();
    }

    /**
     *
     * Limpa os campos que não correspondem ao tipo de documento da entidade
     *
     * @param entity
     * @return entity
     */
    public Proprietario verificarProprietario(Proprietario entity) {
        if (entity.getTipoDocumento() != null) {
            if (entity.getTipoDocumento().equals(TipoDocumento.CPF)) {
                entity = limpaCamposPessoaJuridica(entity);
            } else {
                entity = limpaCamposPessoaFisica(entity);
            }
        } else {
            if (entity.getNome() != null && !entity.getNome().equals("")) {
                entity = limpaCamposPessoaJuridica(entity);
            } else {
                entity = limpaCamposPessoaFisica(entity);
            }
        }

        return entity;
    }

    public Proprietario limpaCamposPessoaFisica(Proprietario p) {
        p.setNome(null);
        p.setCpf(null);
        p.setRg(null);
        p.setProfissao(null);
        p.setDataNasc(null);
        p.setLocalTrabalho(null);

        return p;
    }

    public Proprietario limpaCamposPessoaJuridica(Proprietario p) {
        p.setNomeFantasia(null);
        p.setCnpj(null);

        return p;
    }
}
